package com.easy.util;

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.ObjectMetadata;
import com.aliyun.oss.model.PutObjectRequest;

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.UUID;

public class ImageUtil {
    // OSS配置参数（建议后续移到配置文件中，避免硬编码）
    private static final String ENDPOINT = "oss-cn-beijing.aliyuncs.com";
    private static final String BUCKET_NAME = "lys-java-bucket";
    private static final String ACCESS_KEY_ID = "LTAI5tN6EEWw5Jaf7sU6WQt1";
    private static final String ACCESS_KEY_SECRET = "acho9vwwbTZtDhAu7pV6K1wKL5B7zm";

    // 初始化OSS客户端（使用HTTPS协议更安全，无需手动拼接http://）
    private static OSS ossClient = new OSSClientBuilder().build(ENDPOINT, ACCESS_KEY_ID, ACCESS_KEY_SECRET);

    // 上传图片到OSS
    public static String uploadImage(InputStream is, String fileName) {
        try {
            // 1. 生成唯一文件名（避免重复）
            String suffix = fileName.substring(fileName.lastIndexOf(".")); // 获取文件后缀（如.jpg）
            String newFileName = "fruit/" + UUID.randomUUID() + suffix; // 按业务分类存储（如fruit目录）

            // 2. 设置文件元数据（指定Content-Type，避免浏览器下载图片）
            //根据文件后缀自动识别文件类型，并告诉 OSS 这个文件应该怎么给浏览器展示，避免被当成下载
            ObjectMetadata metadata = new ObjectMetadata();
            metadata.setContentType(getContentType(suffix)); // 自动识别文件类型

            // 3. 上传文件到OSS
            PutObjectRequest request = new PutObjectRequest(BUCKET_NAME, newFileName, is);
            request.setMetadata(metadata);
            ossClient.putObject(request);

            // 4. 生成HTTPS访问URL（推荐使用HTTPS）
            String uploadedUrl = "https://" + BUCKET_NAME + "." + ENDPOINT + "/" + newFileName;
            System.out.println("上传的图片URL: " + uploadedUrl);
            return uploadedUrl;
        } catch (Exception e) {
            throw new RuntimeException("OSS上传失败：" + e.getMessage());
        }
    }

    // 从OSS删除图片
    // ImageUtil.java 的 deleteImage 方法
    public static void deleteImage(String fileName) {
        try {
            System.out.println("开始删除OSS文件：" + fileName);
            ossClient.deleteObject(BUCKET_NAME, fileName); // 核心删除操作
            System.out.println("OSS文件删除成功：" + fileName);
        } catch (Exception e) {
            System.out.println("OSS删除失败：" + e.getMessage());
            throw new RuntimeException("OSS删除失败：" + e.getMessage());
        }
    }

    // 辅助方法：根据文件后缀获取Content-Type
    private static String getContentType(String suffix) {
        if (suffix.equalsIgnoreCase(".jpg") || suffix.equalsIgnoreCase(".jpeg")) {
            return "image/jpeg";
        }
        if (suffix.equalsIgnoreCase(".png")) {
            return "image/png";
        }
        if (suffix.equalsIgnoreCase(".gif")) {
            return "image/gif";
        }
        return "application/octet-stream"; // 默认二进制流
    }

    // 提供getter方法，供UploadController获取私有配置
    public static String getEndpoint() {
        return ENDPOINT;
    }

    public static String getBucketName() {
        return BUCKET_NAME;
    }

    // 测试方法
    public static void main(String[] args) {
        // 注意：实际测试时需替换为真实文件路径
        try {
            File file = new File("D://123.jpg");
            InputStream is = new FileInputStream(file);
            String imgUrl = uploadImage(is, file.getName());
            System.out.println("上传成功：" + imgUrl);

            // 从URL中提取文件名（用于测试删除）
            String fileName = imgUrl.substring(imgUrl.lastIndexOf("/") + 1);
            deleteImage(fileName);
            System.out.println("删除成功：" + fileName);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
